package cn.lanqiao.common.utils;

import sun.misc.BASE64Decoder;
import sun.misc.BASE64Encoder;

import java.io.ByteArrayInputStream;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.util.Arrays;

/**
 * @author Marisa
 * @description Base64工具类
 * @date 2022/3/31
 */
public class Base64Util {

    private Base64Util(){
        super();
    }

    /**
     * Base64解码
     * @param is         输入流(Base64编码)
     * @param charset    编码格式
     * @return           解码结果
     * @throws Exception 异常
     */
    public static String decode(InputStream is, String charset) throws Exception {
        byte[] buffer = new BASE64Decoder().decodeBuffer(is);
        return new String(buffer, charset);
    }

    /**
     * Base64解码
     * @param content    Base64字符串
     * @param charset    编码格式
     * @return           结果
     * @throws Exception 一个异常
     */
    public static String decode(String content, String charset) throws Exception {
        byte[] buffer = new BASE64Decoder().decodeBuffer(content);
        return new String(buffer, charset);
    }

    /**
     * Base64解码
     * @param content    Base64字符串
     * @return           结果(byte数组)
     * @throws Exception 一个异常
     */
    public static byte[] decode(String content) throws Exception {
        return new BASE64Decoder().decodeBuffer(content);
    }

    /**
     * Base64编码
     * @param bytes      byte数组
     * @return           编码结果
     */
    public static String encode(byte[] bytes){
        return new BASE64Encoder().encode(bytes);
    }

    /**
     * Base64编码
     * @param content    待编码内容
     * @return           编码后的结果
     */
    public static String encode(String content){
        return encode(content.getBytes());
    }

    /**
     * Base64编码
     * @param content    待编码内容
     * @param charset    字符编码
     * @return           编码结果
     * @throws Exception 一个异常
     */
    public static String encode(String content, String charset) throws Exception {
        return encode(content.getBytes(charset));
    }

    /**
     * 图像转Base64格式
     * @param imgPath   图片地址
     * @return          结果
     */
    public static String convertFileToBase64(String imgPath) {
        byte[] data = null;
        // 读取图片字节数组
        try {
            InputStream in = new FileInputStream(imgPath);
//            System.out.println("文件大小(字节) = "+in.available());
            data = new byte[in.available()];
            int size = in.read(data);
            System.out.println("文件大小(字节): " + size);
            in.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
        // 对字节数组进行Base64编码，得到Base64编码的字符串
        BASE64Encoder encoder = new BASE64Encoder();
        return encoder.encode(data);
    }

    public static void main(String[] args) throws Exception {
        String str = "author: Marisa";
        System.out.println("str: "+str);// 编码前

        String s1 = encode(str);// 字符串编码
        System.out.println("s1: " + s1);

        String s2 = encode(str, "UTF-8");   // 字符串编码，带编码格式
        System.out.println("s2: " + s2);

        byte[] s3 = decode(s1);// 字符串解码，byte数组
        System.out.println("s3: " + Arrays.toString(s3));

        String s4 = decode(s1, "UTF-8");// 字符串解码，字符串
        System.out.println("s4: " + s4);

        InputStream stream = new ByteArrayInputStream(s1.getBytes());
        String s5 = decode(stream, "UTF-8");
        System.out.println("s5: " + s5);
    }
}